package com.xingfly.service;

import com.xingfly.exception.TipException;
import com.xingfly.model.Tag;
import com.xingfly.repository.TagRepository;
import com.xingfly.util.Property;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 标签服务
 * Created by SuperS on 2016/12/12.
 */
@Service
public class TagService {
    @Autowired
    TagRepository tagRepository;

    /**
     * 检查格式
     *
     * @param tag 标签
     */
    private String check(String tag) {
        if (StringUtils.isEmpty(tag)) {
            return Property.ERROR_TAG_EMPTY;
        }
        return Property.SUCCESS_TAG_FORMAT;
    }

    /**
     * 将字符串转换成Tag列表 参数格式如下
     * 格式:标签1 标签2 标签3
     * 空格区分
     *
     * @param tags tag字符串
     */
    public List<Tag> toList(String tags) {
        if (StringUtils.isEmpty(tags)) {
            return new ArrayList<>();
        }
        String[] tagAndIdStrs = tags.split(" ");
        List<Tag> tagList = new ArrayList<>();
        for (String tag : tagAndIdStrs) {
            String[] tagAndId = tag.split(":");
            Tag t = new Tag();
            if (tagAndId.length > 1) {
                t.setId(Long.valueOf(tag.split(":")[1]));
            }
            t.setTitle(tag.split(":")[0]);
            tagList.add(t);
        }
        return tagList;
    }

    /**
     * 列表转换字符串
     *
     * @param tags tag列表
     */
    public String toString(List<Tag> tags) {
        if (StringUtils.isEmpty(tags)) {
            return null;
        }
        StringBuilder builder = new StringBuilder();
        for (Tag tag : tags) {
            builder.append(tag.getTitle()).append(":").append(tag.getId()).append(" ");
        }
        return builder.toString();
    }

    /**
     * 创建标签根据标签名
     *
     * @param tag 标签名
     */
    public Tag create(String tag) {
        //格式错误
        if (!check(tag).equals(Property.SUCCESS_TAG_FORMAT)) {
            throw new TipException("标签格式错误");
        }
        Tag t = tagRepository.findByTitle(tag);
        if (t != null) {
            return t;
        }
        t = new Tag();
        t.setTitle(tag);
        return tagRepository.save(t);
    }

    /**
     * 创建标签
     *
     * @param tag tag对象
     */
    public Tag create(Tag tag) {
        if (tag == null) {
            throw new TipException("标签不能为空");
        }
        Tag t = tagRepository.findByTitle(tag.getTitle());
        if (t == null) {
            return tagRepository.save(tag);
        }
        return t;
    }

    /**
     * 创建tag列表中的tag
     *
     * @param tags 标签列表
     */
    public List<Tag> create(List<Tag> tags) {
        List<Tag> tagList = new ArrayList<>();
        //如果list为空直接返回
        if (CollectionUtils.isEmpty(tags)) {
            return tags;
        }
        for (Tag tag : tags) {
            if (tagRepository.findByTitle(tag.getTitle()) == null) {
                tagList.add(create(tag));
            } else {
                tagList.add(tagRepository.findByTitle(tag.getTitle()));
            }
        }
        return tagList;
    }

    /**
     * 根据ID获取Tag
     *
     * @param id 标签id
     */
    public Tag findTagById(Long id) {
        return tagRepository.findOne(id);
    }


    /**
     * 根据title获取TAg
     */
    public Tag findTagByTitle(String title) {
        return tagRepository.findByTitle(title);
    }

    /**
     * 获取Tag ID
     *
     * @param tag tag标签名
     */
    public Long getTagId(String tag) {
        return tagRepository.findTagId(tag);
    }

    /**
     * 推荐有图TagList
     */
    public List<Tag> getHasCoverRecommendTags() {
        return tagRepository.findTagsHasCover(new PageRequest(0, 12));
    }

    /**
     * 推荐无图TagList
     */
    public List<Tag> getNotCoverRecommendTags() {
        return tagRepository.findAll(new PageRequest(0, 12)).getContent();
    }
}
